#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "led.h"
#include "bsp_log.h"
#include "tim.h"

#define MODE_NAME "LED"
#define LED_LOG_INFO(fmt, ...) BSP_LOG(LOG_INFO,"%s %s-%d "fmt,MODE_NAME,__FUNCTION__,__LINE__, ##__VA_ARGS__)
#define LED_LOG_DEBUG(fmt, ...) BSP_LOG(LOG_DEBUG, "%s %s-%d "fmt,MODE_NAME,__FUNCTION__, __LINE__,##__VA_ARGS__)
#define LED_LOG_ERROR(fmt, ...) BSP_LOG(LOG_ERROR, "%s %s-%d "fmt,MODE_NAME,__FUNCTION__, __LINE__,##__VA_ARGS__)

/**
 * @brief  初始化 PWM 输出
 * @note   启动 TIM2 的通道 1 的 PWM 功能
 */
void pwm_init()
{
    // 启动 TIM2 的通道 1 PWM输出
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

/**
 * @brief  LED 呼吸灯效果函数
 * @note   通过改变 PWM 占空比实现 LED 亮度渐变，从而产生呼吸灯效果
 * @note   需要定期调用该函数（例如在主循环中）
 */
void LED_breath(void)
{
    // pwm: 当前占空比，范围 0~999（对应定时器的 ARR 设置）
    static uint16_t pwm = 0;

    // dir: PWM 变化方向，0 表示增加亮度，1 表示降低亮度
    static uint8_t dir = 0;

    // 判断当前变化方向
    if (dir == 0) {
        pwm++;  // 如果是上升方向，占空比递增，LED 亮度增加
        if (pwm >= 999) 
            dir = 1;  // 当占空比达到最大值时，改变方向开始减小亮度
    } else {
        pwm--;  // 如果是下降方向，占空比递减，LED 亮度降低
        if (pwm == 0) 
            dir = 0;  // 当占空比为 0 时，改变方向开始增加亮度
    }

    // 设置 TIM2 通道 1 的比较值，相当于改变 PWM 占空比
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm);
    
    // 数值越大，呼吸灯闪烁越慢；数值越小，闪烁越快
   HAL_Delay(3);
}

